package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.RowEditEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteArticulo;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.entidad.ProveedorArticulo;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.CategoriaArticulo;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBComponenteArticulo")
@Scope("request")
public class MBComponenteArticulo extends MBGenerico implements Serializable {

    @Inject
    private BKComponenteArticulo bkComponenteArticulo;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Autowired
    BKSession session;

    public void eliminarArticulo(ActionEvent actionEvent) {

        ProveedorArticulo articuloEliminado = this.bkComponenteArticulo.getCurrentArticulo();

        if (articuloEliminado.getProveedor() == null) {
            Iterator itr = this.bkComponenteArticulo.getListaArticulo().iterator();
            while (itr.hasNext()) {
                ProveedorArticulo prov = (ProveedorArticulo) itr.next();
                if (articuloEliminado.getArticulo().equals(prov.getArticulo())) {
                    itr.remove();
                    break;
                }
            }
        } else {
            this.bkComponenteArticulo.getListaArticulo().remove(articuloEliminado);
            Integer index = bkComponenteArticulo.getListaArticuloEditar().indexOf(articuloEliminado);
            articuloEliminado.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            articuloEliminado.setFecModificacion(new Date());
            articuloEliminado.setUsrModificacion(session.getUsuario().getUsuario());
            this.bkComponenteArticulo.getListaArticuloEditar().set(index, articuloEliminado);
        }

    }

    public void agregarArticulo(ActionEvent actionEvent) {
        List<ProveedorArticulo> listaAgregar = new ArrayList<ProveedorArticulo>();
        for (Articulo art : this.bkComponenteArticulo.getListaArticuloElegidos()) {

            ProveedorArticulo articuloAgregado = new ProveedorArticulo();
            articuloAgregado.setUsrCreacion(session.getUsuario().getUsuario());
            articuloAgregado.setPrecio(BigDecimal.ZERO);
            articuloAgregado.setFecCreacion(new Date());
            articuloAgregado.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            articuloAgregado.setArticulo(art);

            boolean band = true;

            for (ProveedorArticulo prov : this.bkComponenteArticulo.getListaArticulo()) {
                System.out.println("articulo 1: " + articuloAgregado.getArticulo());
                System.out.println("articulo 2: " + prov.getArticulo());
                if (articuloAgregado.getArticulo().equals(prov.getArticulo())) {
                    System.out.println("entro porque es igual");
                    band = false;
                    break;
                }
            }
            if (band) {
                System.out.println("agrego: " + articuloAgregado.getArticulo());
                listaAgregar.add(articuloAgregado);
            }

        }

        for (ProveedorArticulo prov : listaAgregar) {
            System.out.println("lista de articulos agregados: " + prov.getArticulo());
        }

        //try {

        /*} catch (ServiceException e) {
         e.printStackTrace();
         mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
         }*/

        /*if (band) {
         mostrarError("Ya se agrego este articulo");
         } else {*/
        this.bkComponenteArticulo.setIdArticulo(null);
        this.bkComponenteArticulo.getListaArticulo().addAll(listaAgregar);
        this.bkComponenteArticulo.getListaArticuloEditar().addAll(listaAgregar);
        this.bkComponenteArticulo.setListaArticuloElegidos(new ArrayList<Articulo>());
        this.bkComponenteArticulo.setFormularioArticulo(new ProveedorArticulo());
        //}
    }

    public void editarArticulo(RowEditEvent event) {
        ProveedorArticulo articuloEditado = (ProveedorArticulo) event.getObject();
        Integer index = this.bkComponenteArticulo.getListaArticuloEditar().indexOf(articuloEditado);

        if (articuloEditado.getProveedor() != null) {

            articuloEditado.setUsrModificacion(session.getUsuario().getUsuario());
            articuloEditado.setFecModificacion(new Date());
        }

        this.bkComponenteArticulo.getListaArticuloEditar().set(index, articuloEditado);
    }

    public void buscarArticulo() {
        try {

            Articulo articulo = new Articulo();
            articulo.setIdCategoriaArticulo(this.bkComponenteArticulo.getIdCategoriaArticulo());
            this.bkComponenteArticulo.setListaArticuloActivos(servicioArticulo.listarArticulosPorCategoria(articulo));
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }
}
